package v1

import (
	"strconv"
	"wms/internal/model/request"
	"wms/internal/service"
	"wms/pkg/common"

	"github.com/gin-gonic/gin"
)

// CustomerController 客户控制器
type CustomerController struct {
	customerService *service.CustomerService
}

// NewCustomerController 创建客户控制器
func NewCustomerController() *CustomerController {
	return &CustomerController{
		customerService: service.NewCustomerService(),
	}
}

// List 获取客户列表
// @Summary 获取客户列表
// @Description 获取客户列表，支持分页和搜索
// @Tags 客户管理
// @Accept json
// @Produce json
// @Param keyword query string false "关键词(客户编码或名称)"
// @Param status query int false "客户状态(1-启用 2-禁用)"
// @Param level query int false "客户等级(1-普通 2-VIP 3-重要)"
// @Param page query int false "页码" default(1)
// @Param page_size query int false "每页数量" default(10)
// @Success 200 {object} common.Response{data=[]model.Customer} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /customers [get]
func (c *CustomerController) List(ctx *gin.Context) {
	var params struct {
		Keyword  string `form:"keyword"`
		Status   int    `form:"status"`
		Level    int    `form:"level"`
		Page     int    `form:"page" binding:"omitempty,gt=0"`
		PageSize int    `form:"page_size" binding:"omitempty,gt=0"`
	}

	if err := ctx.ShouldBindQuery(&params); err != nil {
		common.BadRequest(ctx, err.Error())
		return
	}

	// 设置默认值
	if params.Page == 0 {
		params.Page = 1
	}
	if params.PageSize == 0 {
		params.PageSize = 10
	}

	customers, total, err := c.customerService.GetCustomerList(params.Keyword, params.Status, params.Level, params.Page, params.PageSize)
	if err != nil {
		common.Error(ctx, "获取客户列表失败: "+err.Error())
		return
	}

	common.Success(ctx, gin.H{
		"list":  customers,
		"total": total,
		"page":  params.Page,
		"size":  params.PageSize,
	})
}

// Get 获取客户详情
// @Summary 获取客户详情
// @Description 根据ID获取客户详情
// @Tags 客户管理
// @Accept json
// @Produce json
// @Param id path int true "客户ID"
// @Success 200 {object} common.Response{data=model.Customer} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 404 {object} common.Response "客户不存在"
// @Failure 500 {object} common.Response "内部错误"
// @Router /customers/{id} [get]
func (c *CustomerController) Get(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Param("id"))
	if err != nil {
		common.BadRequest(ctx, "无效的客户ID")
		return
	}

	customer, err := c.customerService.GetCustomerByID(uint(id))
	if err != nil {
		common.NotFound(ctx, "客户不存在")
		return
	}

	common.Success(ctx, customer)
}

// Create 创建客户
// @Summary 创建客户
// @Description 创建新客户
// @Tags 客户管理
// @Accept json
// @Produce json
// @Param customer body model.Customer true "客户信息"
// @Success 200 {object} common.Response{data=model.Customer} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /customers [post]
func (c *CustomerController) Create(ctx *gin.Context) {
	var req request.CustomerCreateRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.BadRequest(ctx, err.Error())
		return
	}

	if err := c.customerService.CreateCustomer(&req); err != nil {
		common.Error(ctx, "创建客户失败: "+err.Error())
		return
	}

	common.Success(ctx, nil)
}

// Update 更新客户
// @Summary 更新客户
// @Description 根据ID更新客户信息
// @Tags 客户管理
// @Accept json
// @Produce json
// @Param id path int true "客户ID"
// @Param customer body model.Customer true "客户信息"
// @Success 200 {object} common.Response{data=model.Customer} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 404 {object} common.Response "客户不存在"
// @Failure 500 {object} common.Response "内部错误"
// @Router /customers/{id} [put]
func (c *CustomerController) Update(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Param("id"))
	if err != nil {
		common.BadRequest(ctx, "无效的客户ID")
		return
	}

	var req request.CustomerUpdateRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		common.BadRequest(ctx, err.Error())
		return
	}

	req.ID = uint(id)
	if err := c.customerService.UpdateCustomer(&req); err != nil {
		common.Error(ctx, "更新客户失败: "+err.Error())
		return
	}

	common.Success(ctx, nil)
}

// Delete 删除客户
// @Summary 删除客户
// @Description 根据ID删除客户
// @Tags 客户管理
// @Accept json
// @Produce json
// @Param id path int true "客户ID"
// @Success 200 {object} common.Response "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 404 {object} common.Response "客户不存在"
// @Failure 500 {object} common.Response "内部错误"
// @Router /customers/{id} [delete]
func (c *CustomerController) Delete(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Param("id"))
	if err != nil {
		common.BadRequest(ctx, "无效的客户ID")
		return
	}

	if err := c.customerService.DeleteCustomer(uint(id)); err != nil {
		common.Error(ctx, "删除客户失败: "+err.Error())
		return
	}

	common.Success(ctx, nil)
}

// BatchDelete 批量删除客户
// @Summary 批量删除客户
// @Description 批量删除客户
// @Tags 客户管理
// @Accept json
// @Produce json
// @Param ids body []int true "客户ID列表"
// @Success 200 {object} common.Response "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /customers/batch [delete]
func (c *CustomerController) BatchDelete(ctx *gin.Context) {
	var params struct {
		IDs []uint `json:"ids" binding:"required"`
	}

	if err := ctx.ShouldBindJSON(&params); err != nil {
		common.BadRequest(ctx, err.Error())
		return
	}

	if err := c.customerService.BatchDeleteCustomer(params.IDs); err != nil {
		common.Error(ctx, "批量删除客户失败: "+err.Error())
		return
	}

	common.Success(ctx, nil)
}
